#pragma once 
#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include"../../cppjieba/Jieba.hpp"

using namespace std;


namespace searcher
{
  ////////////////////////////////////////////////////////////
  //                  下面展示索引模块
  //////////////////////////////////////////////////////////// 
  
  //定义正排元素
  struct DocInfo
  {
    public:
    int64_t doc_id;
    string title;
    string url;
    string content;
  };
  //定义倒排元素
  struct Weight
  {
    public:
    //该词在哪个文档中出现过
    int64_t doc_id;
    //权重
    int weight;
    //词
    string word;
  };
  

  //Index表示整个索引结构，并且提供一些外部调用的API
  class Index
  {
    public:
        Index();
    private:
        typedef vector<Weight> InvertedList;           //倒排拉链
    private:
        //正排索引
        vector<DocInfo> forward_index; 
        //倒排索引
        unordered_map<string,InvertedList> inverted_index;
    private:
        //分词对象
        cppjieba::Jieba jieba;       //在构造函数中进行初始化
    public:
        //提供一些对外调用的接口
        //1.查正排                   返回指针可以使用NULL表示无效的情况
        const DocInfo* GetDocInfo(int64_t doc_id);
        //2.查倒排
        const InvertedList* GetInvertedList(const string& key);
        //3.构建索引
        bool Build(const string &input_path);
    private:
        //根据读到的line进行解析得到正排对象doc_info
        DocInfo* BuildForward(const string& line);
        //对doc_info解析（分词）
        void BuildInverted(const DocInfo& doc_info);
        void CutWord(const string& input,vector<string>& output);
  };

    

}//namespace searcher 
